home *** CD-ROM | disk | FTP | other *** search
- static char wreaddate_prg1[] =
- "@(#)char *wreaddatew(WINDOW *win,int f, char *dstr) - Datum einlesen (Curses-win)";
- static char wreaddate_prg2[] =
- "@(#)char *readdatew(int f, char *dstr) - Datum einlesen (Curses-stdscr)";
- static char wreaddate_ver[] = "@(#)v1.00/kr ; 01.08.91";
- /* [w]readdatew Einlesen eines Datum-String - Curses-Version
- **
- ** Autor Klaus Rath
- **
- ** Deklaration char *wreaddatew(WINDOW *win,int format, char *datestring);
- **
- ** Compilation DOS: bcc -c wreaddate.c c:\usr\local\lib\libkrc_s.lib
- ** UNIX: cc -c wreaddate.c /u1/usr/lib/libkrc.a
- ** ( unter DOS kann die Funktion im small-Modell laufen )
- **
- ** Übergabe Die Funktion erwartet einen Integer, der angibt in wel-
- ** chem Format eingelesen werden soll.
- ** Z.Zt. erlaubte Formate (siehe datum.h) :
- ** tt.mm.[jj]jj -- Deutsches Format (format: 1,2)
- ** mm/tt/[jj]jj -- Amerikanisches Format (format: 3,4)
- ** [jj]jjmmtt -- Datenbankformat DDB/4 (format: 5,6)
- ** tt.mm. | mm/tt -- Kurzformat deutsch/am. (format: 7,8).
- ** Außerdem wird ein Zeiger auf ein char-Array zur Aufnahme
- ** des Ergebnisses erwartet.
- **
- ** Rückgabe (char *) auf datestring
- **
- ** Anmerkungen Die Funktion prüft nicht die Validität des eingegebenen
- ** Datums - dies sollte die aufrufende Funktion selbst tun,
- ** bzw. den Test durch checkdate() durchführen lassen.
- ** Die Funktion benutzt zum Einlesen wgetch(win).
- ** wreaddate() stellt dem Aufrufer eine Maske des angeforder-
- ** ten Format zur Verfügung ( z.B. __.__.__ ), wobei die
- ** Unterstriche durch Zahlen gefüllt werden müssen. Die
- ** u.U. nötigen Trennzeichen sind im Gegensatz zu den Zahlen
- ** nicht editierbar und werden automatisch erzeugt. Eine
- ** Korrektur der Zahlen ist über die BACKSPACE-Taste möglich.
- ** Die Eingabe von RETURN oder ESCAPE beendet die Eingabe
- ** immer, hinter der letzten Position genügt ein beliebige
- ** Tastendruck dafür - außer BACKSPACE, wg. Korrektur.
- **
- ** Änderungen 1.00 ; 01.08.91
- ** - Erste Version für CURSES, basiert auf Version 1.10 von
- ** readdate().
- ** 1.01 ; 12.12.91
- ** - Einlesefehler beseitigt: obwohl für ein WINDOW *win
- ** konzipiert, wurde in wreaddate() mit getch() gelesen.
- */
-
- #include <curses.h>
- #include <string.h>
- #ifdef __TURBOC__
- #define ANSI
- #define KR_SYS
- #include <stdlib.h>
- #include "datum.h"
- #include "util.h"
- #else
- #include "/u1/usr/include/datum.h"
- #include "/u1/usr/include/util.h"
- #endif
-
- /* Normalversion :
- */
- #ifdef ANSI
- char *wreaddatew(WINDOW *win,int format, char *dstring)
- #else
- char *wreaddatew(win,format,dstring)
- WINDOW *win;
- int format;
- char *dstring;
- #endif
- {
- /* Variablendefinitionen :
- */
- int trennpos1 = 2, /* Positionen von Trennzeichen */
- trennpos2 = 5;
- int trenner; /* das Trennzeichen */
- int pos = 0; /* Aktuelle Position */
- int maxpos = 11; /* Letztmögliche Position */
- int Max = 0; /* Schalter, ob am Ende */
- int ch; /* Einzulesendes Zeichen */
- int def_char = '_'; /* Default-Character */
-
- /* Evtl. 1. Zeichen berücksichtigen :
- */
- if ( dstring[0] == NULL ) {
- dstring[0] = def_char;
- }
- else {
- pos = 1;
- }
-
- /* Format überprüfen, String vorbelegen, Anzeigemaske erzeugen :
- */
- switch ( format ) {
- case DE_KURZ :
- trenner = '.';
- maxpos = 9;
- dstring[trennpos1] =
- dstring[trennpos2] = trenner;
- wprintw(win,"%c_.__.__",dstring[0]);
- wprintw(win,"\b\b\b\b\b\b\b");
- break;
- case DE_LANG :
- trenner = '.';
- maxpos = 11;
- dstring[trennpos1] =
- dstring[trennpos2] = trenner;
- wprintw(win,"%c_.__.____",dstring[0]);
- wprintw(win,"\b\b\b\b\b\b\b\b\b");
- break;
- case AM_KURZ :
- trenner = '/';
- maxpos = 9;
- dstring[trennpos1] =
- dstring[trennpos2] = trenner;
- wprintw(win,"%c_/__/__",dstring[0]);
- wprintw(win,"\b\b\b\b\b\b\b");
- break;
- case AM_LANG :
- trenner = '/';
- maxpos = 11;
- dstring[trennpos1] =
- dstring[trennpos2] = trenner;
- wprintw(win,"%c_/__/____",dstring[0]);
- wprintw(win,"\b\b\b\b\b\b\b\b\b\b");
- break;
- case DB_KURZ :
- maxpos = 7;
- trennpos1 =
- trennpos2 = 99;
- wprintw(win,"%c_____",dstring[0]);
- wprintw(win,"\b\b\b\b\b");
- break;
- case DB_LANG :
- maxpos = 9;
- trennpos1 =
- trennpos2 = 99;
- wprintw(win,"%c_______",dstring[0]);
- wprintw(win,"\b\b\b\b\b\b\b");
- break;
- case DE_AKTJAHR :
- trenner = '.';
- maxpos = 7;
- dstring[trennpos1] =
- dstring[trennpos2] = trenner;
- wprintw(win,"%c_.__.",dstring[0]);
- wprintw(win,"\b\b\b\b\b");
- break;
- case AM_AKTJAHR :
- trenner = '/';
- maxpos = 6;
- dstring[trennpos1] = trenner;
- trennpos2 = 99;
- wprintw(win,"%c_/__",dstring[0]);
- wprintw(win,"\b\b\b\b");
- break;
- default:
- trenner = '.';
- maxpos = 9;
- dstring[trennpos1] =
- dstring[trennpos2] = trenner;
- } /* ENDE: switch(format) */
-
- /* Evtl. noch ein Rückschritt :
- */
- if ( !pos ) {
- wprintw(win,"\b");
- }
- wrefresh(win);
-
- /* Tastendrucke abholen, bis maxpos :
- */
- while ( pos < maxpos + 1 ) {
-
- if ( pos == 0 ) {
- dstring[pos] = def_char;
- }
- wrefresh(win);
-
- /* Falls fertig, String zurückgeben :
- */
- if ( pos == maxpos ) {
- dstring[pos] = '\0';
- return(dstring);
- }
- /* An eventuellen Trennerpositionen den passenden Trenner einfügen
- ** und den nächsten Schleifendurchlauf abwarten :
- */
- if ( pos == trennpos1 || pos == trennpos2 ) {
- wprintw(win,"%c",trenner);
- wrefresh(win);
- pos++;
- continue;
- }
- /* An der vorletzten Position sind alle Tasten erlaubt, denn nur
- ** BACKSPACE bleibt in der Funktion :
- */
- if ( pos == maxpos - 1 ) {
- Max = 1;
- }
- ch = wgetch(win);
-
- /* Auswertung der gedrückten Taste :
- */
- switch ( ch ) {
-
- /* Nicht Zulässiges ignorieren :
- */
- case NULL:
- case -1 :
- break;
-
- /* Abbruchmöglichkeiten :
- */
- case 27 :
- dstring[0] = '\0';
- return(dstring);
- case 10 :
- case 13 :
- dstring[pos] = '\0';
- return(dstring);
-
- /* Korrekturmöglichkeit :
- */
- case 8 :
- dstring[pos] = def_char;
- if ( pos == 0 ) {
- break;
- }
-
- /* Schalter für MAX-Position zurücksetzen :
- */
- if ( Max )
- Max = 0;
-
- /* Trenner überspringen und Maskendefault anzeigen :
- */
- if ( pos == trennpos1 + 1 || pos == trennpos2 + 1 ) {
- wprintw(win,"\b\b%c\b",def_char);
- wrefresh(win);
- pos -= 2;
- break;
- }
-
- /* Ansonsten zurück und Maskendefault anzeigen :
- */
- if ( pos ) {
- pos--;
- }
- wprintw(win,"\b%c\b",def_char);
- wrefresh(win);
- break;
- default :
- /* Falls wir fertig sind, String abschließen und
- ** zurückgeben :
- */
- if ( Max ) {
- dstring[pos] = '\0';
- return(dstring);
- }
-
- /* Ansonsten ist es eine Zahl, die angezeigt und ein-
- ** getragen wird :
- */
- if ( ch > '9' || ch < '0' ) {
- break;
- }
- wprintw(win,"%c",ch);
- wrefresh(win);
- dstring[pos] = ch;
- pos++;
-
- } /* ENDE: switch(ch) */
- } /* ENDE: while(pos) */
-
- return(dstring);
-
- } /* ENDE: wreaddatew() */
-
- /* Version für stdscr :
- */
- char *readdatew(format,dstring)
- int format;
- char *dstring;
- {
- wreaddatew(stdscr,format,dstring);
- return(dstring);
- } /* ENDE: readdatew() */
-
-